// 函数柯里化
// carry 返回的是一个 fn
// 执行fn， 中间状态返回函数
// 参数够了，最后执行返回结果
export function curry(fn: Function): Function {
  const fnArgsLength = fn.length // 传入函数的参数
  let args: any[] = []

  function calc(...newArgs: any[]) {
    args = [
      ...args,
      ...newArgs
    ]
    if(args.length < fnArgsLength) {
      // 参数不够，返回函数
      return calc
    }else {
      // 参数够了，返回执行结果
      return fn.apply(this, args.slice(0, fnArgsLength))
    }
  }

  return calc
}

function add (a: number, n: number): number {
  return a + n
}

const curryAdd = curry(add)
const res = curryAdd(10)(20)
console.log(res);